9  Dataframes en R

9.1 Introducción

En esta sessión se realizará un flujo de trabajo de construcción de un indicador territorial de delitos a nivel comuna utilizando R. Que contempla desde la lectura de la base de información (excel de delitos), agregar información de categorías, hacer filtros, resúmenes estadísticos (tablas dinámicas) y finalmente visualizaciones gráficas y espaciales.

9.2 Librerías

library(dplyr) # manipular tablas de datos
library(sf) #manipular objetos espaciales
library(openxlsx) # trabajar con archivos Excel
library(ggplot2) # graficos estáticos 
library(plotly) # gráficos dinámicos

9.3 Lectura de una tabla

Se leerá el archivo excel que se vio la semana pasada de delitos comunales.

delitos_tbl <- read.xlsx("data/excel/delitos_comunales.xlsx")

# str(delitos_tbl)

ver los primeros 6 registros

head(delitos_tbl)
  REGION                       NOM_REGION PROVINCIA  NOM_PROVIN COMUNA
1     05             REGIÓN DE VALPARAÍSO       056 SAN ANTONIO  05602
2     13 REGIÓN METROPOLITANA DE SANTIAGO       135   MELIPILLA  13502
3     08                REGIÓN DEL BIOBÍO       083      BIOBÍO  08314
4     01               REGIÓN DE TARAPACÁ       011     IQUIQUE  01107
5     03                REGIÓN DE ATACAMA       033      HUASCO  03302
6     10              REGIÓN DE LOS LAGOS       102      CHILOÉ  10202
       NOM_COMUNA PERSONAS Tipo.Participante Subgrupo HOMBRE_delitos
1       ALGARROBO    13794           VICTIMA Abigeato              0
2           ALHUÉ     6365           VICTIMA Abigeato              1
3     ALTO BIOBÍO     5823           VICTIMA Abigeato              2
4   ALTO HOSPICIO   106297           VICTIMA Abigeato              0
5 ALTO DEL CARMEN     5280           VICTIMA Abigeato              0
6           ANCUD    38845           VICTIMA Abigeato              9
  MUJER_delitos TOTAL_delitos
1             0             0
2             0             1
3             3             5
4             0             0
5             0             0
6             1            10

9.4 Agregar Categoría

Categorizar los Delitos:

Primeros veremos los tipos de delitos que existen, contenidos en la columna Subgrupo:

unique(delitos_tbl$Subgrupo)
[1] "Abigeato"                           "Abusos sexuales"                   
[3] "Amenazas con armas"                 "Amenazas o riña"                   
[5] "Animales sueltos en la vía pública" "Auxilio al suicidio"               
  • Se muestran los primeros 6 solo para buena visualización en el libro digital, en la práctica deben existir 50 categorias de delitos.

Crear una categoría de delitos

Se debe crear un grupo de delitos de su interés (Puede elegir los que usted quiera). Para este ejemplo se seleccionarán los delitos de violentos.

#guardo los delitos violentos en un vector
d_agrupados <- c( "Lesiones graves o gravísimas", "Lesiones menos graves",
                  "Microtráfico de sustancias", "Otros homicidios",
                  "Robo con homicidio", "Robo violento de vehículo motorizado",
                  "Robos con violencia o intimidación", "Tráfico de sustancias")

# leves o incivilidades
# d_agrupados <- c( "Amenazas con armas", "Amenazas o riña", 
#                   "Desórdenes públicos", "Comercio ilegal" , 
#                   "Consumo de alcohol y drogas en la vía pública", 
#                   "Daños", "Lesiones leves" , "Desórdenes públicos",
#                   "Desórdenes públicos", "Ofensas al pudor",
#                   "Porte de arma cortante o punzante","Receptación",
#                   "Robo de objetos de o desde vehículo",
#                   "Robo por sorpresa" )

Agregar Categoría de delitos

Para esto crearemos una nueva columna con la función mutate()

delitos_tbl <- delitos_tbl %>% 
  mutate(grupo = ifelse(Subgrupo %in% d_agrupados, TRUE, FALSE))


# head(delitos_tbl)

count(delitos_tbl, grupo)
  grupo     n
1 FALSE 28980
2  TRUE  5520
dim(delitos_tbl)
[1] 34500    13

9.5 Filtros

Filtrar por Tipo de Participante

delitos_filtered <- delitos_tbl %>% 
  filter(Tipo.Participante == "VICTIMA")

Filtrar por Región

delitos_filtered <- delitos_filtered %>% 
  filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")

Filtrar por Categortía

delitos_filtered <- delitos_filtered %>% 
  filter(grupo == T)

9.6 Generar Resúmenes (similar a tablas dinámicas)

Se buscarà replicar desde R las operaciones correspondientes a esta tabla dinámica
tabla_resumen <- delitos_filtered %>% 
  group_by(NOM_COMUNA) %>% 
  summarise(total_delitos = sum(TOTAL_delitos),
            pob = min(PERSONAS))
  
tabla_resumen
# A tibble: 32 × 3
   NOM_COMUNA total_delitos   pob
   <chr>              <dbl> <dbl>
 1 ANGOL                147 52958
 2 CARAHUE               38 24458
 3 CHOLCHOL              33 11581
 4 COLLIPULLI           108 24439
 5 CUNCO                 19 17275
 6 CURACAUTÍN            33 17253
 7 CURARREHUE            13  7361
 8 ERCILLA               53  7704
 9 FREIRE                67 24390
10 GALVARINO             31 11914
# ℹ 22 more rows

Ponderar por población

tabla_resumen <- tabla_resumen %>% 
  mutate(pond_poblacion = total_delitos / pob) %>% 
  mutate(del_10000_hab = pond_poblacion * 10000) %>% 
  mutate(del_10000_hab = round(del_10000_hab,2))  # redondear con 2 decimales

head(tabla_resumen)
# A tibble: 6 × 5
  NOM_COMUNA total_delitos   pob pond_poblacion del_10000_hab
  <chr>              <dbl> <dbl>          <dbl>         <dbl>
1 ANGOL                147 52958        0.00278          27.8
2 CARAHUE               38 24458        0.00155          15.5
3 CHOLCHOL              33 11581        0.00285          28.5
4 COLLIPULLI           108 24439        0.00442          44.2
5 CUNCO                 19 17275        0.00110          11  
6 CURACAUTÍN            33 17253        0.00191          19.1

9.7 Visualización gráfica

library(ggplot2)
g_barra <- ggplot(tabla_resumen, aes(x = NOM_COMUNA, y = del_10000_hab)) +
  geom_bar(fill = "#6a51a3", color =  "gray90", stat = "identity", width = 0.7)+
  coord_flip()+
  theme_bw()+
  labs(title="Delitos Violentos en la Región de la Araucanía", 
       y ="Delitos Violentos / 10000 hebitantes", x = "Nombre de Comuna")+
  theme(plot.title = element_text(face = "bold",colour= "gray20", size=12)) 
  
g_barra

Guardar el gráfico de barras como imagen

ggsave(plot = g_barra, filename = "images/del_violentos_R09.png", width = 8, height = 7)

Generar gráfico dinámico

library(plotly)
ggplotly(g_barra)

9.8 Visualización Espacial

Primero se debe unir la tabla resumen delitos con Shapefile de comunas del INE.

Leer Shapefile de comunas

comunas_r09 <- st_read("data/shape/Comunas_Chile.shp") %>% 
  filter(NOM_REGION == "REGIÓN DE LA ARAUCANÍA")
Reading layer `Comunas_Chile' from data source 
  `/Users/denisberroeta/Library/CloudStorage/OneDrive-UniversidadAdolfoIbanez/CIT/DOCENCIA/DIPLOMADOS/DEDT_book/data/shape/Comunas_Chile.shp' 
  using driver `ESRI Shapefile'
Simple feature collection with 346 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: -3701691 ymin: 3734031 xmax: 705926.2 ymax: 8065316
Projected CRS: WGS 84 / UTM zone 19S
head(comunas_r09)
Simple feature collection with 6 features and 9 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
  OBJECTID REGION             NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1      196     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09102    CARAHUE
2      197     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09116   SAAVEDRA
3      198     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09121   CHOLCHOL
4      199     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09106  GALVARINO
5      200     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09211   VICTORIA
6      201     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09202 COLLIPULLI
  Shape_Leng Shape_Area                       geometry
1   2.906029 0.13808364 MULTIPOLYGON (((121386.1 57...
2   1.208166 0.04046546 MULTIPOLYGON (((116508.5 57...
3   1.231271 0.04440834 MULTIPOLYGON (((154657.2 57...
4   1.466943 0.05865461 MULTIPOLYGON (((169736.5 57...
5   2.049851 0.12969648 MULTIPOLYGON (((200422.2 57...
6   2.832457 0.13410231 MULTIPOLYGON (((195536.1 58...

Unir shafile con tabla resumen

Se utilizará la función left_join

comunas_r09 <- comunas_r09 %>% 
  left_join(tabla_resumen, by = "NOM_COMUNA")

head(comunas_r09)
Simple feature collection with 6 features and 13 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 105710.9 ymin: 5678347 xmax: 264088.7 ymax: 5814662
Projected CRS: WGS 84 / UTM zone 19S
  OBJECTID REGION             NOM_REGION PROVINCIA NOM_PROVIN COMUNA NOM_COMUNA
1      196     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09102    CARAHUE
2      197     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09116   SAAVEDRA
3      198     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09121   CHOLCHOL
4      199     09 REGIÓN DE LA ARAUCANÍA       091     CAUTÍN  09106  GALVARINO
5      200     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09211   VICTORIA
6      201     09 REGIÓN DE LA ARAUCANÍA       092    MALLECO  09202 COLLIPULLI
  Shape_Leng Shape_Area total_delitos   pob pond_poblacion del_10000_hab
1   2.906029 0.13808364            38 24458    0.001553684         15.54
2   1.208166 0.04046546            32 12380    0.002584814         25.85
3   1.231271 0.04440834            33 11581    0.002849495         28.49
4   1.466943 0.05865461            31 11914    0.002601981         26.02
5   2.049851 0.12969648           107 34103    0.003137554         31.38
6   2.832457 0.13410231           108 24439    0.004419166         44.19
                        geometry
1 MULTIPOLYGON (((121386.1 57...
2 MULTIPOLYGON (((116508.5 57...
3 MULTIPOLYGON (((154657.2 57...
4 MULTIPOLYGON (((169736.5 57...
5 MULTIPOLYGON (((200422.2 57...
6 MULTIPOLYGON (((195536.1 58...

9.8.1 Generar Mapa

library(viridis)
del_r09_m <- ggplot() +
  geom_sf(data = comunas_r09, aes(fill = del_10000_hab), alpha=0.8,  size= 0.5)+
  scale_fill_viridis_c()+
  ggtitle("Delitos Violentos en la Región de la Araucanía" ) +
  theme_bw() +
  # theme(legend.position="none")+
  theme(panel.grid.major = element_line(colour = "gray80"), 
        panel.grid.minor = element_line(colour = "gray80"))

del_r09_m

Guardar el Mapa como imagen

ggsave(plot = del_r09_m, filename = "images/map_del_violentos_R09.png", width = 8, height = 7)

Mapa Dinámico

library(mapview)

mapview(comunas_r09, zcol = "del_10000_hab", alpha.regions = 0.9)

9.9 Guardar Resultados

# Excel
write.xlsx(tabla_resumen, file = "data/excel/R09_del_violentos.xlsx")

# Shapefile 
st_write(comunas_r09, "data/shape/R09_del_violentos.shp", delete_dsn = T)

# rds
saveRDS(object = comunas_r09,file = "data/rds/R09_del_violentos.rds")